<?php
class Vend_LoteBSN extends GenericBSN {

	function __construct() {
		$this->dao = new Vend_LoteDAO();		
	}

	public function consultar($vars) {
		$this->preencher($vars);
		$this->Records = $this->dao->consultar($this->where, $this->params, $this->order . $this->limit);
		$this->Result  = "OK";
	}
	
	public function consultarPK($vars) {
		$this->Records = $this->dao->consultarPK($vars['id']);
		$this->Result = "OK";
	}
	
	public function consultarPedido($vars) {
		$this->Records = $this->dao->consultarPedido($vars['pedido']);
		$this->Result = "OK";
	}
	
	public function consultarPedidoAdquirente($vars) {
		$this->Records = $this->dao->consultarPedidoAdquirente($vars['pedidoAdq']);
		$this->Result = "OK";
	}
	
	public function consultarPedidoLote($vars) {
		$this->Records = $this->dao->consultarPedidoLote($vars['pedidolote'], isset($vars['sepultamento']) ? "S" : "N");
		$this->Result = "OK";
	}
	
	public function inserir($vars) {
		$registro['pedido']		  = $vars['pedido'];
		$registro['lote'] 		  = $vars['l_id'];
		$registro['adquirente']   = $vars['ad_id'];
		$registro['data']		  = $vars['data'];
		$registro['vr_lote']	  = str_replace(',', '.', str_replace('.', '', $vars['vr_lote']));
		$registro['desconto']	  = str_replace(',', '.', str_replace('.', '', $vars['desconto']));
		$registro['impostos']	  = str_replace(',', '.', str_replace('.', '', $vars['impostos']));
		$registro['forma_pgto']	  = $vars['forma_pgto'];
		$registro['n_parcelas']	  = $vars['n_parcelas'];
		$registro['vr_entrada']	  = str_replace(',', '.', str_replace('.', '', $vars['vr_entrada']));
		$registro['vcto_entrada'] = $vars['vcto_entrada'];
		$registro['vr_parcela']	  = str_replace(',', '.', str_replace('.', '', $vars['vr_parcela']));
		$registro['vcto_parcela'] = $vars['vcto_parcela'];
		
		try {
			$concessao = $this->dao->inserir($registro, false);
			
			$mapaDAO 	= new MapaDAO();
			$planoDAO 	= new PlanoDAO();
			$contRecBSN = new Cont_RecBSN();
			
			$mapa = $mapaDAO->consultarQuadra($vars['q_id']);
			$novoMapa['id'] 		= $mapa[0]['id'];
			$novoMapa['vendidos'] 	= $mapa[0]['vendidos'] + 1;
			$novoMapa['avenda'] 	= $mapa[0]['avenda'] - 1;
			if (!$mapaDAO->alterar($novoMapa, false)) {
				throw new Exception('Erro ao atualizar mapa.');
			}
				
			$plano		= $planoDAO->consultarCodigoDescQuadra("________001", $vars['q_id']);
			
			if ($registro['vr_entrada'] > 0) {
				$contRec['data']		= date('d/m/Y');
				$contRec['ad_id']		= $registro['adquirente'];
				$contRec['historico']	= 'ENTRADA REF. PED. RES. Nº ' . $registro['pedido'];
				$contRec['vcto']		= $registro['vcto_entrada'];
				$contRec['vr_titulo']	= $registro['vr_entrada'];
				$contRec['pd_id']		= $concessao['id'];
				$contRec['parcela']		= ' ';
				$contRec['tipo']		= 'E';
				$contRec['pl_id']		= $plano[0]['id'];

				$contRecBSN->inserir($contRec, false);
				
				if ($vars['quitar_entrada'] == 'S') {
					$contRec['id']			= $contRecBSN->Record['id'];
					$contRec['recebto']		= $contRec['data'];
					$contRec['vr_recebido']	= $contRec['vr_titulo'];
					$contRec['ct_id']		= 12;
					$contRec['historico2'] 	= 'RECBTO. ENTR. REF. PED. RES. Nº ' . $registro['pedido'];
					
					$contRecBSN->receber($contRec, false);
					
					unset($contRec['id']);
				}
				
			}
			
			$dataVcto = DateTime::createFromFormat('d/m/Y', $registro['vcto_parcela']);
			unset($contRec['id']);
			unset($contRec['recebto']);
			unset($contRec['vr_recebido']);
			unset($contRec['ct_id']);
			unset($contRec['historico2']);
				
			for ($n = 1; $n <= $registro['n_parcelas']; $n++) {
				$contRec['historico']	= "PARCELA $n/" . $registro['n_parcelas'] . ' REF. PED. RES. Nº ' . $registro['pedido'];
				$contRec['vcto']		= $dataVcto->format('d/m/Y');
				$contRec['vr_titulo']	= $registro['vr_parcela'];
				$contRec['parcela']		= "$n/" . $registro['n_parcelas'];
				$contRec['tipo']		= 'P';

				$contRecBSN->inserir($contRec, false);
				
				$dataVcto->add(new DateInterval('P1M'));
			}
			$this->dao->commit();
			
			$this->Record  = $concessao; 
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar inserir: " . $e->getMessage();
		}
	}
	
	public function alterar($vars) {
		$registro['id'] 	 	  = $vars['id'];
		$registro['pedido']		  = $vars['pedido'];
		$registro['lote'] 		  = $vars['l_id'];
		$registro['data']		  = $vars['data'];
		$registro['vr_lote']	  = $vars['vr_lote'];
		$registro['desconto']	  = $vars['desconto'];
		$registro['impostos']	  = $vars['impostos'];
		$registro['forma_pgto']	  = $vars['forma_pgto'];
		$registro['n_parcelas']	  = $vars['n_parcelas'];
		$registro['vr_entrada']	  = $vars['vr_entrada'];
		$registro['vcto_entrada'] = $vars['vcto_entrada'];
		$registro['vr_parcela']	  = $vars['vr_parcela'];
		$registro['vcto_parcela'] = $vars['vcto_parcela'];
						
		try {
			$old = $this->dao->consultarPK($registro['id']);
					
			$this->Record = $this->dao->alterar($registro, false);

			if ($old[0]['q_id'] <> $vars['q_id']) {
				$mapaDAO = new MapaDAO();
				
				$mapa = $mapaDAO->consultarQuadra($old[0]['q_id']);
				$novoMapa['id'] 		= $mapa[0]['id'];
				$novoMapa['vendidos'] 	= $mapa[0]['vendidos'] - 1;
				$novoMapa['avenda'] 	= $mapa[0]['avenda'] + 1;
				$mapaDAO->alterar($novoMapa, false);
				
				$mapa = $mapaDAO->consultarQuadra($vars['q_id']);
				$novoMapa['id'] 		= $mapa[0]['id'];
				$novoMapa['vendidos'] 	= $mapa[0]['vendidos'] + 1;
				$novoMapa['avenda'] 	= $mapa[0]['avenda'] - 1;
				$mapaDAO->alterar($novoMapa);
			}
			
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar alterar: " . $e->getMessage();
		}
	}
	
	public function excluir($registro) {
		$contRecDAO = new Cont_RecDAO();
		try {
			$venda = $this->dao->consultarPK($registro['id']);
			$contas = $contRecDAO->consultarPedido($venda[0]['pedido']);
			if (isset($contas[0])) {
				throw new Exception('Essa reserva não pode ser excluída por haver contas a receber/recebidas ligadas a ela.');
			} 
			
			$res = $this->dao->excluir($registro['id'], false);
			
			$mapaDAO = new MapaDAO();
			$mapa = $mapaDAO->consultarQuadra($venda[0]['q_id']);
			$novoMapa['id'] 		= $mapa[0]['id'];
			$novoMapa['vendidos'] 	= $mapa[0]['vendidos'] - 1;
			$novoMapa['avenda'] 	= $mapa[0]['avenda'] + 1;
			$mapaDAO->alterar($novoMapa);
			
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar excluir: " . $e->getMessage();
		}
	}
	
	public function ativar($vars) {
		try {
			if ($vars['ativo'] == 'S') {
				// quitar contas a receber futuras
				$contRecBSN = new Cont_RecBSN();
				$contRecBSN->suspenderConcessao($vars['id'], false);
				if ($contRecBSN->Result != "OK") {
					throw new Exception($contRecBSN->Message);
				}
			}
				
			unset($vars['action']);
			$this->dao->suspender($vars);
			$this->Result = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			if ($vars['ativo'] == "S") {
				$this->Message = "Erro ao tentar suspender concessão: " . $e->getMessage();
			} else {
				$this->Message = "Erro ao tentar cencelar suspensão: " . $e->getMessage();
			}
		}
	}
	
	public function consultarQuitacao($vars) {
		$this->Records = $this->dao->consultarQuitacao($vars['pedido']);
		$this->Result = "OK";
	}
	
	public function quitar($vars) {
		$contRecDAO 	= new Cont_RecDAO();
		$contRecBSN		= new Cont_RecBSN();
		
		try {
			if (!isset($vars['ct_id'])) {
				throw new Exception('Conta para crédito não informada!');
			}
			
			if (!isset($vars['pedido'])) {
				throw new Exception('Pedido não informado!');
			}
			
			if (!isset($vars['desconto'])) {
				$vars['desconto'] = "0,00";
			}
			
			$pedido		= $vars['pedido'];
			$desconto 	= str_replace(',', '.', str_replace('.', '', $vars['desconto']));
			
			// identificar parcelas e dividir o desconto 
			$contas 	= $contRecDAO->consultarQuitacao($pedido);
			$frDesconto	= $desconto / count($contas);

			// quitar parcelas
			foreach ($contas as $num => $conta) {
				$conta['recebto']		= date('d/m/Y');
				if ($num == count($contas) - 1) {
					$conta['juros']		= str_replace('.', ',', ($desconto - ($frDesconto * $num)) * -1);
				} else {
					$conta['juros']		= str_replace('.', ',', $frDesconto * -1);
				}
				$conta['ct_id']			= $vars['ct_id'];
				$contRecBSN->receber($conta, false);
				if ($contRecBSN->Result != "OK") {
					throw new Exception($contRecBSN->Message);
				}
			}
			$contRecDAO->commit();
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar quitar lote: " . $e->getMessage();
		}
	}
	
	public function transferir($vars) {
		try {
			$contaBSN = new Cont_RecBSN();
			
			// gerar taxa de transferência para o novo adquirente
			$txTransf['data'] 		= date('d/m/Y');
			$txTransf['ad_id'] 		= $vars['ad_id'];
			$txTransf['historico'] 	= 'Taxa de transferência do lote ' . $vars['lote'];
			$txTransf['vcto'] 		= $vars['vcto'];
			$txTransf['vr_titulo'] 	= "223,00"; // ***config***
			$txTransf['tipo'] 		= 'O';
			
			$contaBSN->inserir($txTransf, false);			
			if ($contaBSN->Result != "OK") {
				throw new Exception($contaBSN->Message);
			}
			
			// transferir contas a receber para o novo adquirente
			$contaBSN->transferirConcessao($vars['id'], $vars['ad_id'], false);
			if ($contaBSN->Result != "OK") {
				throw new Exception($contaBSN->Message);
			}
			
			// alterar o pedido de reserva para o novo adquirente
			$registro['id'] 		= $vars['id'];
			$registro['adquirente'] = $vars['ad_id'];
			
			$this->dao->transferir($registro);
			$this->Result 			= "OK";
		} catch (Exception $e) {
			$this->Result  			= "ERROR";
			$this->Message 			= "Erro ao tentar transferir concessão: " . $e->getMessage();
		}
	}
	
	public function renegociar($vars) {
		try {
			$contaBSN = new Cont_RecBSN();

			if (!isset($vars['ad_id'])) {
				throw new Exception('Adquirente não informado!');
			}
			
			$cons['ad_id'] = $vars['ad_id'];
			$cons['tipo']  = 'debitos';
			$contaBSN->consultarRenegociacao($cons);

			foreach($contaBSN->Records as $debito) {
				$reg['id'] 	= $debito['id'];
				$plano_id 	= $debito['pl_id'];
				$contaBSN->renegociar($reg, false);
				if ($contaBSN->Result == "ERROR") {
					throw new Exception($contaBSN->Message);
				}
			}

			if (isset($vars['avencer']) && ($vars['avencer'] == "1")) {
				$cons['tipo']  	= 'avencer';
				$contaBSN->consultarRenegociacao($cons);
				foreach($contaBSN->Records as $debito) {
					$reg['id'] 	= $debito['id'];
					$plano_id 	= $debito['pl_id'];
					$contaBSN->renegociar($reg, false);
					if ($contaBSN->Result == "ERROR") {
						throw new Exception($contaBSN->Message);
					}
				}
			}
						
			$dataVcto = DateTime::createFromFormat('d/m/Y', $vars['vcto_primeira']);
			for ($n = 1; $n <= $vars['num_parcelas']; $n++) {
				$contRec['historico']	= "Renegociação em " . date('d/m/Y');
				$contRec['vcto']		= $dataVcto->format('d/m/Y');
				$contRec['vr_titulo']	= $vars['vr_parcela'];
				$contRec['parcela']		= "$n/" . $vars['num_parcelas'];
				$contRec['tipo']		= 'P';
				$contRec['ad_id']  		= $vars['ad_id'];
				$contRec['data']		= date('d/m/Y');
				$contRec['tipo']		= 'R';
				$contRec['pl_id']		= $plano_id;

				$contaBSN->inserir($contRec, false);
				$dataVcto->add(new DateInterval('P1M'));
			}
			$this->dao->commit();
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar renegociar: " . $e->getMessage();
		}
	}
	
	public function relatorio($vars) {
		try {
			$this->Records = $this->dao->consultarRelatorio(
				$vars['sq_codigo'],
				$vars['q_codigo'],
				$vars['dt_ini'],
				$vars['dt_fim'],
				$vars['tipo'], 
				$vars['filtro'],
				$vars['ordem']);
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar gerar relatório: " . $e->getMessage();
		}
	}
	
	public function ctrcancelados($vars) {
		try {
			$this->Records = $this->dao->consultarCancelados($vars['tipo']);
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar gerar relatório de contratos cancelados: " . $e->getMessage();
		}
	}

	public function gerarmanut($vars) {
		try {
			if (!isset($vars['tipo'])) {
				throw new Exception("Tipo de geração não informado!");
			}
			if (!isset($vars['ano'])) {
				throw new Exception("Ano limite para a geração não informado!");
			}
			$this->Records = $this->dao->gerarManut($vars['tipo'], $vars['ano']);
			$this->Result  = "OK";
			$this->Message = "Manutenções geradas com sucesso!";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar gerar taxas de manutenção: " . $e->getMessage();
		}
	}
	
	public function importar() {
		set_time_limit(0);
		$loteDAO 	= new LoteDAO();
		$adqDAO		= new AdquirenteDAO();
		$fonte 		= file("vend_lote.csv");
		$recs		= null;
		
		try {
			foreach($fonte as $num => $linha) {
				$reg 	= explode(",", $linha);

				for ($i = 0; $i < count($reg); $i++) {
					$reg[$i] = substr($reg[$i], strpos($reg[$i], '"') + 1);
					$reg[$i] = str_replace('"', "", $reg[$i]);
				}

				$lote 	= $loteDAO->consultarCodigo($reg[1]);
				if (!isset($lote[0])) {
					throw new Exception("Lote não encontrado: " . $reg[1]);
				}
				
				$adq	= $adqDAO->consultarCPF($reg[2]);
				if (!isset($adq[0])) {
					throw new Exception("Adquirente não encontrado: " . $reg[2]);
				}
				
				$vend_lote['pedido'] 		= $reg[0];
				$vend_lote['lote']			= $lote[0]['id'];
				$vend_lote['adquirente']	= $adq[0]['id'];
				$vend_lote['data']			= substr($reg[3], 8, 2) . "/" . substr($reg[3], 5, 2) . "/" . substr($reg[3], 0, 4);
				$vend_lote['vr_lote']		= ($reg[4] == "") ? "0.00" : substr($reg[4], 0, strpos($reg[4], ".") + 3);
				$vend_lote['desconto']		= ($reg[5] == "") ? "0.00" : substr($reg[5], 0, strpos($reg[5], ".") + 3);
				$vend_lote['impostos']		= ($reg[6] == "") ? "0.00" : substr($reg[6], 0, strpos($reg[6], ".") + 3);
				$vend_lote['forma_pgto']	= $reg[7];
				$vend_lote['n_parcelas']	= $reg[8];
				$vend_lote['vr_entrada']	= ($reg[9] == "") ? "0.00" : substr($reg[9], 0, strpos($reg[9], ".") + 3);
				if ($reg[10] <> "") {
					$vend_lote['vcto_entrada']	= substr($reg[10], 8, 2) . "/" . substr($reg[10], 5, 2) . "/" . substr($reg[10], 0, 4);
				} else {
					unset($vend_lote['vcto_entrada']);
				}
				$vend_lote['vr_parcela']	= ($reg[11] == "") ? "0.00" : substr($reg[11], 0, strpos($reg[11], ".") + 3);
				if ($reg[12] <> "") {
					$vend_lote['vcto_parcela']	= substr($reg[12], 8, 2) . "/" . substr($reg[12], 5, 2) . "/" . substr($reg[12], 0, 4);
				} else {
					unset($vend_lote['vcto_parcela']);
				}
				$vend_lote['ativo']			= substr($reg[13][0], 0, 1);
				$vend_lote['certificado']	= (trim($reg[14]) == "") ? "N" : substr($reg[14], 0, 1);

				$recs[] = $this->dao->inserir($vend_lote, false);
			}
			$this->dao->commit();
			$this->Result  = "OK";
			$this->Records = $recs;
			$this->Message = "Importação concluída com sucesso!";
		} catch (Exception $e) {
			$this->dao->rollback();
			$this->Result  = "ERROR";
			$this->Records = $recs;
			$this->Message = "Erro ao importar registros de vendas: " . $e->getMessage();
		}
	}
}
?>